﻿
namespace FastFood.Windows.Forms.Administracion.Comestibles
{
    using System;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;

    public partial class CwfComercializables : UserControl
    {
        public EstadoActual estadoActual;
        private double stockActual;

        public CwfComercializables()
        {
            InitializeComponent();
        }

        private void CwfInsumos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.nombreTextBox.Focus();
            this.insumosBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.nombreTextBox.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (stockActual > 0)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "No se puede eliminar un insumo con stock mayor a 0");
            }
            else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.insumosBindingSource.Current != null)
                {
                    LoadInsumo(this.insumosBindingSource.Current as Insumos);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.insumosBindingSource.Current != null)
                    {
                        LoadInsumo(this.insumosBindingSource.Current as Insumos);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.insumosDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.insumosBindingSource.CancelEdit();
            this.insumosDataGridView.Focus();
        }

        private void insumosDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadInsumo(this.insumosBindingSource.Current as Insumos);
            }
        }

        private void insumosDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.insumosDataGridView.SelectedRows.Count != 0)
                {
                    if (stockActual > 0)
                    {
                        Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "No se puede eliminar un insumo con stock mayor a 0");
                    }
                    else if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.insumosBindingSource.Current != null)
                        {
                            LoadInsumo(this.insumosBindingSource.Current as Insumos);
                        }
                    }
                }
            }
        }

        private void InitialLoad()
        {
            try
            {
                InsumosManager insumoManager = new InsumosManager();
                this.insumosBindingSource.DataSource = insumoManager.ListarByVendible(true);
                this.insumosBindingNavigator.BindingSource = this.insumosBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadInsumo(Insumos insumo)
        {
            this.insumosIDLabel.Text = insumo.insumoID.ToString();
            this.nombreTextBox.Text = insumo.nombre;
            this.unidadTextBox.Text = insumo.unidad;
            this.precioTextBox.Text = insumo.precio.ToString();
            this.descripcionTextBox.Text = insumo.descripcion;
            this.chkLotes.Checked = insumo.tieneLote;
            this.chkFechaVencimiento.Checked = insumo.tieneVencimiento;
            this.chkRefrigeracion.Checked = insumo.requiereRefrigeracion;
            this.stockActual = insumo.stock;

            bool puedeCambiar = (this.stockActual == 0);
            this.chkLotes.Enabled = puedeCambiar;
            this.chkFechaVencimiento.Enabled = puedeCambiar;
            this.lblMensajeLotes.Visible = !puedeCambiar;
            this.lblMensajeVencimiento.Visible = !puedeCambiar;
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                InsumosManager insumoManager = new InsumosManager();

                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        insumoManager.Agregar(GetInsumo());
                        break;
                    case EstadoActual.Editar:
                        insumoManager.Modificar(GetInsumo());
                        break;
                    case EstadoActual.Eliminar:
                        insumoManager.Eliminar(Convert.ToByte(this.insumosIDLabel.Text));
                        this.insumosBindingSource.RemoveCurrent();
                        break;
                }

                this.insumosBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Insumos GetInsumo()
        {
            return new Insumos
            {
                insumoID = Convert.ToInt16(this.insumosIDLabel.Text),
                nombre = nombreTextBox.Text,
                vendible = true,
                unidad = unidadTextBox.Text,
                precio = Convert.ToDecimal(precioTextBox.Text),
                descripcion = descripcionTextBox.Text,
                tieneLote = chkLotes.Checked,
                tieneVencimiento = chkFechaVencimiento.Checked,
                requiereRefrigeracion = chkRefrigeracion.Checked,
                stock = stockActual
            };
        }

        private bool ValidateData()
        {
            bool result = true;

            if (string.IsNullOrEmpty(this.unidadTextBox.Text))
            {
                this.errValidator.SetError(this.unidadTextBox, "Ingresar Unidad.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.unidadTextBox, string.Empty);
            }

            if (string.IsNullOrEmpty(this.precioTextBox.Text))
            {
                this.errValidator.SetError(this.precioTextBox, "Ingresar Precio.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.precioTextBox, string.Empty);
            }

            if (string.IsNullOrEmpty(this.nombreTextBox.Text))
            {
                this.errValidator.SetError(this.nombreTextBox, "Ingresar Nombre.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.nombreTextBox, string.Empty);
            }
            return result;

        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.insumosBindingNavigator.Enabled = valor;
            this.insumosDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.insumosDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.insumosDataGridView.Enabled = true;
            }
        }

        private void ClearControls()
        {
            this.insumosIDLabel.Text = "0";
            this.nombreTextBox.Text = string.Empty;
            this.unidadTextBox.Text = string.Empty;
            this.precioTextBox.Text = string.Empty;
            this.descripcionTextBox.Text = string.Empty;
            this.chkLotes.Enabled = true;
            this.chkLotes.Checked = false;
            this.chkFechaVencimiento.Enabled = true;
            this.chkFechaVencimiento.Checked = false;
            this.chkRefrigeracion.Checked = false;
            this.stockActual = 0;
            this.lblMensajeLotes.Visible = false;
            this.lblMensajeVencimiento.Visible = false;
            this.errValidator.Clear();
        }
    }
}
